Описание задачи

1. Импорт библиотек, инициализация констант и базовых функций

2 Работа с данными

2.1 Подключение к SQL-базе (Яндекса). Загрузка таблиц sql.

2.2 Исследовательский анализ и предобработка данных

2.2.0 Функции необходимые для обработки данных

2.2.1 Таблица steel.data_arc

2.2.1.1 Общий взгляд на данные

2.2.1.2 Анализ числовых переменных и борьба с выбросами

Наши данные имеют нормальное распрделение это поможет нам в обучении модели, а также борбе с пропусками и выбросами.

Как можно заметить из гистограммы для рекативной мощности ReactivePower там имеют место быть сильные выбросы, к тому же данные выбросы имеют отрицательный знак, что невозможно в условиях нашей работы, где электрод должен только поглощать энергию, следовательно, значение мощности должно быть неотрицательным.

Данный вывод сделан из отсутствия дополнительных сведений от заказчика касаемо конфигурации и управления электроэнергетической системой, так как, например, в системе могут быть установлены устройства для коррекции коэффициента мощности, такие как конденсаторы или синхронные компенсаторы, которые могут давать отрицательную реактивную мощность

Как мы видим, аномальное значение находится в единственном экзмепляре, это облегчит нам задачу и снизит влияние выбросов на итоговое качество данных.

С учетом нормальности распределений обоих величин, а также небольшой иллюстрации сверху, можно сделать вывод, что аномальное значение можно заменить значением из того же персентиля для ReactivePower, в котором находится значение ActivePower

2.2.1.3 Генерация признаков

2.2.1.3.1 Переменные основанные на времени
2.2.1.3.2 Числовые переменные

Создадим дополнительные столбцы с суммарной и относительной мощностями для каждой записи, подсчитаем число нагревов для каждой партии, вычислим количество энергии переданной металлу по формуле energy = power x time и проагрегируем записи, чтобы у нас одной партии соответствовало одно наблюдение.

Столбцы со временем не будем включать, так как все необходимые признаки мы из них вытащили, а для модели они будут бесполезны.

2.2.2 Таблица steel.data_bulk

2.2.2.1 Общий взгляд на данные

Позже пропуски мы можем заполнить нулевыми значениями, чтобы модели могли нормально работать.

2.2.2.3 Анализ числовых переменных

2.2.2.4 Проверка на отсутствие добавлений сыпучих материалов

Согласно технологиям, представленных заказчиком, в партию обязательно должны добавляться проволочные материалы. Поэтому проверим, есть ли такие партии, в которые данные материалы не добавлялись и после, если найдем, удалим.

2.2.3 Таблица steel.data_bulk_time

2.2.3.1 Общий взгляд на данные

Как мы видим, данная таблица содержит только время подачи сыпучих материалов аналогичные партиям в таблице data_bulk. Учитывая, что здесь есть пропуски, которые мы не сможем никак заполнить, а после вытащить из них какую-то агрегированную информацию, по типу разницей между подачами сыпчих песков, то использовать данную таблицу нам не имеет смысла, так как у нас не задача временных рядов.

2.2.4 Таблица steel.data_gas

2.2.4.1 Общий взгляд на данные

2.2.4.2 Анализ числовых переменных

Перед нами ярковыраженное нормальное распределение. Присутствуют несколько выбросов, однако они не сильно выбиваются из нашей картины, поэтому оставим их для лучшего качества модели.

2.2.5 Таблица steel.data_temp

2.2.5.1 Общий взгляд на данные

Мы видим, что пропуски у нас появляются на самых поздних замерах, что бывают полностью незаписанные замеры, а бывают замеры для партий, которые единожды не нулевые, а после для этой партии идут пропуски.

Значит, поступим следующим образом:

  1. Оставим партии, где первый и последний замер - непустые значения;
  2. Удалим партии, где значения либо первого, либо последнего замеров менее 1500 градусов, данное решение следует из критерия заказчика.

Для начала создадим столбцы со стартовым и конечным временем замеров партии для всех записей, чтобы позже отрфильтровать нужные нам записи. Также проверим идут ли наши ключи партий в порядке возрастания, а время в каждой партии примем за возрастающее. Хотя в рабочей ситуации данные моменты лучше уточнять у заказчика.

Если проверка окажется успешной, то это сможет облегчить нам задачу преобразования таблицы.

2.2.5.2 Анализ числовых переменных

2.2.5.3 Агрегирование таблицы и добавление признаков

Агрегация прошла успешно, это видно по уменьшившимуся ровно в два раза финальному версии датасета, а также по первым 10 преобразованным записям.

Далее создадим синтетическую переменную, равную разнице конечного времени и начального. И после вычислим разницу в секнудах.

2.2.6 Таблица steel.data_wire

2.2.6.1 Общий взгляд на данные

Все пропуски мы заполним нулями, так как это соответствует недобавлению материала, что было сообщено нам заказачиком.

Также число записей в таблице соответствует числу уникальных key в данной таблице.

2.2.6.2 Проверка на отсутствие добавлений проволочных материалов

Согласно технологиям, представленных заказчиком, в партию обязательно должны добавляться проволочные материалы. Поэтому проверим, есть ли такие партии, в которые данные материалы не добавлялись и после, если найдем, удалим.

2.2.7 Таблица steel.data_wire_time

2.2.7.1 Общий взгляд на данные

Как мы видим данная таблица содержит исключительно временные метки аналогичные партиям из таблицы data_wire так как у нас нет возможности грамотно заполнить данные пропуски, и плюс перед нами задача не временных рядов, то данную таблицу мы не будем использовать для обучения модели.

2.2.8 Объединение таблиц по ключу

Произведем объединение всех таблиц по ключу key методом inner, так как если у партии не было одного из процессов (т.е. данной партии нет в одной из таблиц), то данная партия не соответствует технологическому процессу и её стоит удалить в результирующей таблице.

По условию нам необходимо, чтобы одной партии соответствовало одно наблюдение, поэтому проверим число записец в нашей таблице и число уникальных ключей (номеров партий).

Объединение фреймов произведено корректно.

Далее посмотрим на столбцы и типы данных, содержащиеся в них.

В нашем датафрейме присутствуют "мусорные признаки" со временем, а именно MesaureTime_start, MesaureTime_final, TimeDifference. Их нужно удалить, так как они никак не смогут далее помочь с обучением, потому что модели не смогут их корректно обработать.

Также сделаем номер партии индексом.

2.2.9 Анализ признаков объединенной таблицы

Наши числовые признаки в больше степени представлены распределениями близкими к нормальному, для некоторых из переменных Wire и Bulk имеют место экспоненциальные и равномерные распределения.

Возможно, стоит удалить признаки, с равномерным распределением, а именно Wire 7 и Wire 5, так как в данном столбце содержится слишком много нулей и всего пару ненунлевых значений.

Остальные признаки стоит оставить, так как для модели они будут полезными ввиду разнообразности данных в них и распределений, которые они содержат.

2.2.10 Корреляционный анализ признаков

У нас есть сильноскоррелированные данные. Во избежание обмана модели из-за возникновения мультиколлениарности удалим признаки, которые имеют коэффициент корреляции более 0.95

Столбцы для удаления: TotalPower, TotalPower^2, ActivePower^2, log_ActivePower, log_ReactivePower, log_TotalPower, log_TotalEnergy, multiplication_Powers, PowerRatio, Wire 4, Wire 7, Wire 8, Bulk 8

3. Обучение модели

3.1 Подготовка тренировочных и тестовых данных

3.2 LinearRegression

3.3 Ridge regression

3.4 RandomForestRegressor

3.4 CatboostRegressor

3.5 Полносвязная нейронная сеть

3.6 Выводы по лучшей модели

Самые лучшие метрики при подборе гиперпараметров и кросс-валидации показала модель полносвязной нейронной сети. Результат ошибки MAE на валидационных данных получился равным 5.22, что является неплохим результатом, учитывая критерий заказчика. Однако предстоит ее работу на тестовых данных, где наша метрика должна быть ниже 6.7 MAE.

Остальные модели (линейный регрессии, лес решений, бустинг) показали примерно схожие результаты, однако у них ошибка оказалась больше на 0.5-1 MAE, что в контексте нашей размерности не такая большая разница. Поэтому в случае необходимости можно будет использовать данные модели для оценки важности признаков, если это будет затруднительно сделать с моделью NN.

4 Тестирование работы модели и демонстрации ее работы

4.1 Сравнение работы лучшей модели с константной

Как мы видим, целевая метрика нашей лучшей модели является гораздо лучше, плюс ко всему в сравнении с константной моделью наша r2_score является отличной и говорит о том, что 60% вариабельности зависимой переменной может быть объяснено предикторами в модели. Также константная модель, что видно по второй метрике и по определению не может объяснить свои предсказания.

Поэтому для продакшена выбреем именно нашу лучшую обученную модель НС.

4.2 Анализ важности признаков

Модель посчитала самымы важными признаками Bulk 7, Bulk 13, Bulk 2 - это количество добавляемых сыпучих материалов. Однако для различных записей из нашего датафрейма наша модель будет находить различные признаки, которые окажутся более важными для предсказания целевой метрики.

Такое возможно ввиду нелинейной зависимости нашего таргета от признаков. Проверим данное предположение с помощью диаграммы рассеяния, в котором мы сравним как распредлены таргеты в зависимости от значений одной из самых важных метрик.

Судя по той информации, что была получена видна нелийнейность зависимости между фичами и таргетом, и данную нелинейность наша модель смогла хорошо уловить, учитывая результаты ее работы.

5. Общий вывод по работе

В ходе работы мы выгрузили наши датафреймы с серверов работодателя.

В качестве рекомендаций, которые я могу дать заказчику, можно назвать следующие моменты: